// объект отображения области большой карты View_Map

var View_Map = {    name: 'Map',    // имя холста
                    N: 0,       // размер матрицы карты, т.е. кол-во клеток карты
                    xMap: 500,  // координаты отображения карты (верхний центр), относит. [0,0] холста
                    yMap: 0,
                    iView: 0,   // координаты отрисовки области карты (всегда самая верхняя ячейка)
                    jView: 0,   // это смещение относително [0,0] матрицы карты Map_matrix
                    xPs: 0,     // координаты области для вырезки из базовой карты
                    yPs: 0,     // в пикселях относительно [0,0] изображения карты
                    iMs: 0,     // координаты курсора мыши в единицах клетки относительно [iView, jView]
                    jMs: 0,
                    xMs: 0,     // положение курсора мыши в пикселях относительно [0,0] холста
                    yMs: 0,
                    iFnDt: 0,   // положение финишной точки перехода для юнита относительно [iView, jView]
                    jFnDt: 0,
                    xFnDt: 0,   // координаты финишной точки в пикселях относительно [0,0] холста
                    yFnDt: 0,
                    cW: 50,     // размеры ячейки, кот. отображается
                    cH: 25,
                    indFDote: false,    // индикатор нажатия финишной точки
                    indMap: false,
                    indMove: 0, // индикатор перемещения курсора мыши по области карты
                    indFind: 0, // индикатор прорисовки пути следования юнита
                    init: Init_View_Map,    // инициализация объекта View_Map
                    drFirst: Draw_First,    // прорисовка навигационных по карте кнопок
                    drUnit: Draw_Unit,
                    drLct: Draw_Location,
                    drWay: Draw_Way
};

function Init_View_Map() {
    // инициализация объекта View_Map
    jc.start(View_Map.name, 25);
    if (View_Map.indMap)
        jc({layer:'gamer'}).del();
    Gamer.i = 0;
    Gamer.j = 0;
    View_Map.iView = 0;
    View_Map.jView = 0;
    View_Map.indMap = true;
    View_Map.N = Map_matrix.length;
    jc.line([[5,225],[405,25],[805,225],[405,425],[5,225]], '#000000', 0).layer('map')
        .mousemove(Draw_Cell_Under_Cursor);
    jc.line([[5,5],[805,5],[805,225],[405,25],[5,225]], '#ffffff', 1).layer('nav');
    jc.line([[5,225],[405,425],[5,425]], '#ffffff', 1).layer('nav');
    jc.line([[405,425],[805,225],[805,425]], '#ffffff', 1).layer('nav');
    var style = 'rgba(255, 255, 0, 0.5)';
    jc.line([[50,50],[250,50],[50,150]], style, 1).id('ltop').layer('nav')
        .click(LeftTopClick)
        .mouseover(ChangeFocus_1)
        .mouseout(ChangeFocus_2);
    jc.line([[560,50],[760,50],[760,150]], style, 1).id('rtop').layer('nav')
        .click(RightTopClick)
        .mouseover(ChangeFocus_1)
        .mouseout(ChangeFocus_2);
    jc.line([[50,300],[250,400],[50,400]], style, 1).id('ldown').layer('nav')
        .click(LeftDownClick)
        .mouseover(ChangeFocus_1)
        .mouseout(ChangeFocus_2);
    jc.line([[560,400],[760,300],[760,400]], style, 1).id('rdown').layer('nav')
        .click(RightDownClick)
        .mouseover(ChangeFocus_1)
        .mouseout(ChangeFocus_2);

}

function Draw_First() {
    // прорисовка игрока (метод используется только при загрузке)
    if((View_Map.N - Gamer.i) < 16) {
        View_Map.iView = Gamer.i - (16 - (View_Map.N - Gamer.i));
    } else
        View_Map.iView = Gamer.i;
    if((View_Map.N - Gamer.j) < 16) {
        View_Map.jView = Gamer.j - (16 - (View_Map.N - Gamer.j));
    } else
        View_Map.jView = Gamer.j;
    Little_Map.init(View_Map.name);
    View_Map.drLct();   // отрисовка карты
    View_Map.drUnit();  // отрисовка юнита
}

function Draw_Unit() {
    // прорисовка юнита на области карты в зависимости от его координат на карте
    var di, dj;
    di = Gamer.i - View_Map.iView;
    dj = Gamer.j - View_Map.jView;
    if(di || dj) {
        Gamer.x = 380 + 25 * (di - dj);
        Gamer.y = 12.5 * (di + dj);
    } else {
        Gamer.x = 380;
        Gamer.y = 0;
    }
    jc.image(Gamer.view, Gamer.x, Gamer.y, 50, 50).layer('gamer');
    Little_Map.unit(View_Map.name);
}

function Draw_Location() {
    // отрисовка области карты
    View_Map.xPs = (View_Map.iView - View_Map.jView) * View_Map.cW/2 + View_Map.xMap - 375;
    View_Map.yPs = (View_Map.iView + View_Map.jView) * View_Map.cH/2 + View_Map.yMap;
    jc.image(Map.view, View_Map.xPs, View_Map.yPs,800,400,5,25,800,400).layer('map');
    jc.line([[5,225],[405,25],[805,225],[405,425],[5,225]], '#000000', 0).layer('map')
        .mousemove(Draw_Cell_Under_Cursor);
    Little_Map.draw(View_Map.name);   // вызов метода объекта мелкой карты Little_Map (скрипта ViewLettleMap.js)
}

function Draw_Cell_Under_Cursor(point) {
    // подсвечивание ячейки карты, над кот. курсор
    if(View_Map.indMove)
        jc('#dot').del();
    else View_Map.indMove = 1;
    var xx = 380, yy = 25;
    View_Map.jMs = (2 * (point.y - yy) - point.x + xx) / 2;
    View_Map.iMs = point.x + View_Map.jMs - xx - 25;
    View_Map.jMs = Math.round(View_Map.jMs / 25);
    View_Map.iMs = Math.round(View_Map.iMs / 25);
    View_Map.xMs = 380 + 25 * (View_Map.iMs - View_Map.jMs);
    View_Map.yMs = 37.5 + 12.5 * (View_Map.iMs + View_Map.jMs);
    var style;
    if (Map_matrix[View_Map.iView + View_Map.iMs][View_Map.jView + View_Map.jMs] < 5)
        style = 'rgba(255, 255, 120, 0.5)';
    else style = 'rgba(152, 120, 237, 0.5)';
    jc.line([[View_Map.xMs,View_Map.yMs],[View_Map.xMs+25,View_Map.yMs-12.5],
        [View_Map.xMs+50,View_Map.yMs],[View_Map.xMs+25,View_Map.yMs+12.5]],style, 1)
            .id('dot').layer('cell').click(Find_Finish_Cell);
}

function Find_Finish_Cell() {
    // метод нахождения координат финишной точки
    if((Map_matrix[View_Map.iView + View_Map.iMs][View_Map.jView + View_Map.jMs] < 5)
            && (((Gamer.i - View_Map.iView) != View_Map.iMs) || ((Gamer.j - View_Map.jView) != View_Map.jMs))) {
        // нахождение координат и положения финишной точки
        var di, dj; // смещение на карте от юнита до финиш. точки (в единицах клетки)
        var i_pl = Gamer.i - View_Map.iView, j_pl = Gamer.j - View_Map.jView;
        // смещение юнита относительно верхней точки карты
        View_Map.xFnDt = View_Map.xMs;
        View_Map.yFnDt = View_Map.yMs - 37.5;
        di = (View_Map.xFnDt - Gamer.x) / 50;
        dj = (View_Map.yFnDt - Gamer.y) / 25;
        View_Map.iFnDt = i_pl + Math.round(di + dj);
        View_Map.jFnDt = j_pl + Math.round(dj - di);
        Move_matrix.init(View_Map.iView, View_Map.jView, i_pl, j_pl, View_Map.iFnDt, View_Map.jFnDt);
        View_Map.indFDote = true;
        if(Move_matrix.find)
            View_Map.drWay();
    }
}

function Draw_Way() {
    if (View_Map.indFind)
        jc({layer:'way'}).del();
    else View_Map.indFind = 1;
    var massiv = Move_matrix.find_way();
    var x_way_pos = Gamer.x, y_way_pos = Gamer.y + 37.5;
    var style = 'rgba(100, 150, 215, 0.5)';
    jc('#dot').color('rgba(255, 0, 0, 0.5)');
    for(var i = 0; i < massiv.length; i++) {
        switch(massiv[i]) {
            case 0: x_way_pos += 25; y_way_pos += 12.5; break;
            case 1: x_way_pos -= 25; y_way_pos -= 12.5; break;
            case 2: x_way_pos -= 25; y_way_pos += 12.5; break;
            case 3: x_way_pos += 25; y_way_pos -= 12.5; break;
        }
        jc.line([[x_way_pos, y_way_pos],[x_way_pos + 25, y_way_pos - 12.5],
            [x_way_pos + 50, y_way_pos],[x_way_pos + 25, y_way_pos + 12.5]], style, 1).layer('way');
    }
}

function goTo() {
    // обработчик нажатия кнопки "Go"
    if (Move_matrix.find && View_Map.indFDote) {
        if (View_Map.indFind) {
            jc({layer:'way'}).del();
            jc({layer:'gamer'}).del();
        }
        View_Map.indFDote = false;
        View_Map.indFind = 0;
        jc('#dot').del();
        View_Map.indMove = 0;
        Gamer.i = View_Map.iView + View_Map.iFnDt;
        Gamer.j = View_Map.jView + View_Map.jFnDt;
        Web_Socket.send(13, View_Map.iFnDt, View_Map.jFnDt);    // отправка пакета серверу
        View_Map.drUnit();
    }
}

function LeftTopClick() {
    // обработчик нажатия левой верхней клавиши просмотра карты
    if((View_Map.iView >= 1) && (Gamer.i < (View_Map.iView + 15))) {
        View_Map.iView--;
        AllClick();
    }
}

function LeftDownClick() {
    // обработчик нажатия левой нижней клавиши просмотра карты
    if((View_Map.jView < (Map.matrix.length - 16)) && ((View_Map.jView + 1) <= Gamer.j)) {
        View_Map.jView++;
        AllClick();
    }
}

function RightTopClick() {
    // обработчик нажатия правой верхней клавиши просмотра карты
    if((View_Map.jView >= 1) && (Gamer.j < (View_Map.jView + 15))) {
        View_Map.jView--;
        AllClick();
    }
}

function RightDownClick() {
    // обработчик нажатия правой нижней клавиши просмотра карты
    if((View_Map.iView < (Map.matrix.length - 16)) && ((View_Map.iView + 1) <= Gamer.i)) {
        View_Map.iView++;
        AllClick();
    }
}

function AllClick() {
    // общий обработчик для всех кликов
    if (View_Map.indFind) {
        jc({layer:'way'}).del();
        jc({layer:'gamer'}).del();
        View_Map.indFind = false;
    }
    if (View_Map.indFDote) View_Map.indFDote = false;
    jc({layer:'map'}).del();
    jc({layer:'gamer'}).del();
    View_Map.drLct();
    View_Map.drUnit();
}

function ChangeFocus_1() {
    // изменение атрибутов кнопки при наведении на неё курсора
    this.color('rgba(255, 255, 0, 1)');
}

function ChangeFocus_2() {
    // изменение атрибутов кнопки при отведении
    this.color('rgba(255, 255, 0, 0.5)');
}